package learn;

public class three {
    public static void main(String[] args) {
        int i = (100+200) * (99-88);
        int n = 7 * (5+(i-9));
        System.out.println(i);
        System.out.println(n);
        /*整数的数值表示不但是精确的，而且整数运算永远是精确的，即使是除法也是精确的，
        因为两个整数相除只能得到结果的整数部分：*/
        int x = 12345 / 67; // 184
        /*求余运算使用%：*/
        int y = 12345 % 67; // 12345÷67的余数是17

        //要特别注意，整数由于存在范围限制，如果计算结果超出了范围，
        // 就会产生溢出，而溢出不会出错，却会得到一个奇怪的结果：
        int x1 = 2147483640;
        int y1 = 15;
        int sum = x1 + y1;
        System.out.println(sum); // -2147483641
        // 要解决上面的问题，可以把int换成long类型，、
        // 由于long可表示的整型范围更大，所以结果就不会溢出：
        long x2 = 2147483640;
        long y2 = 15;
        long sum2 = x2 + y2;
        System.out.println(sum2); // 2147483655

        //还有一种简写的运算符，即+=，-=，*=，/=，它们的使用方法如下：
        n += 100; // 3409, 相当于 n = n + 100;
        n -= 100; // 3309, 相当于 n = n - 100;

        int n2 = 3300;
        n2++; // 3301, 相当于 n = n + 1;
        n2--; // 3300, 相当于 n = n - 1;
        int y3 = 100 + (++n2); // 不要这么写
        System.out.println(y3);

        //移位运算
        //左移
        int n3 = 7;       // 00000000 00000000 00000000 00000111 = 7
        int a1 = n3 << 1;  // 00000000 00000000 00000000 00001110 = 14
        int b1 = n3 << 2;  // 00000000 00000000 00000000 00011100 = 28
        int c1 = n3 << 28; // 01110000 00000000 00000000 00000000 = 1879048192
        int d1 = n3 << 29; // 11100000 00000000 00000000 00000000 = -536870912
        //右移
        int a2 = n >> 1;  // 00000000 00000000 00000000 00000011 = 3
        int b2 = n >> 2;  // 00000000 00000000 00000000 00000001 = 1
        int c2 = n >> 3;  // 00000000 00000000 00000000 00000000 = 0

        //如果对一个负数进行右移，最高位的1不动，结果仍然是一个负数：
        int n4 = -536870912;
        int a3 = n4 >> 1;  // 11110000 00000000 00000000 00000000 = -268435456
        int b3 = n4 >> 2;  // 11111000 00000000 00000000 00000000 = -134217728
        int c3 = n4 >> 28; // 11111111 11111111 11111111 11111110 = -2
        int d3 = n4 >> 29; // 11111111 11111111 11111111 11111111 = -1

        //位运算

        //与运算的规则是，必须两个数同时为1，结果才为1：
        n = 0 & 0; // 0
        n = 0 & 1; // 0
        n = 1 & 0; // 0
        n = 1 & 1; // 1

        //或运算的规则是，只要任意一个为1，结果就为1：
        n = 0 | 0; // 0
        n = 0 | 1; // 1
        n = 1 | 0; // 1
        n = 1 | 1; // 1

        //非运算的规则是，0和1互换
        n = ~0; // 1
        n = ~1; // 0

        //异或运算的规则是，如果两个数不同，结果为1，否则为0：
        n = 0 ^ 0; // 0
        n = 0 ^ 1; // 1
        n = 1 ^ 0; // 1
        n = 1 ^ 1; // 0

        int i5 = 167776589; // 00001010 00000000 00010001 01001101
        int n5 = 167776512; // 00001010 00000000 00010001 00000000
        System.out.println(i & n); // 167776512

    }

}
